package com.three.iot.channel.impl.aliyun;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.iot.model.v20180120.CreateProductRequest;
import com.aliyuncs.iot.model.v20180120.CreateProductResponse;
import com.aliyuncs.iot.model.v20180120.QueryProductListRequest;
import com.aliyuncs.iot.model.v20180120.QueryProductListResponse;
import com.github.pagehelper.Page;
import com.three.iot.commons.enums.Result;
import com.three.iot.commons.enums.ResultCode;
import com.three.iot.channel.api.ProductChannelService;
import com.three.iot.channel.po.CreateProductReqPo;
import com.three.iot.channel.po.ProductCondPo;
import com.three.iot.channel.po.ProductRespPo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author luiz
 * @Title: ProductChannelServiceAliyun
 * @ProjectName iot-server
 * @Description: TODO
 * @date 2019-05-07 13:36
 */
@Service
@Slf4j
public class ProductChannelServiceAliyun extends AbstractChannelServiceAliyun implements ProductChannelService {

    @Override
    public Result<ProductRespPo> createProduct(CreateProductReqPo createProductPo) {
        CreateProductRequest request = new CreateProductRequest();
        /**
         * 为新建产品命名。产品名应满足以下限制：由4-30位中文、英文字母、数字和下划线（_）组成（一个中文字符占两位）。
         */
        request.setProductName(createProductPo.getProductName());
        request.setDescription(createProductPo.getProductDesc());
        /**
         * 产品的节点类型，取值：
         *
         * 0：设备。设备不能挂载子设备。可以直连物联网平台，也可以作为网关的子设备连接物联网平台。
         *
         * 1：网关。网关可以挂载子设备，具有子设备管理模块，维持子设备的拓扑关系，和将拓扑关系同步到物联网平台。
         */
        request.setNodeType(Integer.valueOf(createProductPo.getNodeType()));
        /**
         * 产品版本类型选择为iothub_senior的产品数据格式。
         * 此参数为高级版产品的特有参数，并且是创建高级版产品的必需参数。
         *
         * 可选值：
         *
         * 0：透传/自定义格式（CUSTOM_FORMAT）。
         * 1：Alink协议（ALINK_FORMAT）。
         */
        request.setDataFormat(Integer.valueOf(createProductPo.getDataFormat()));

        /**
         * 联网方式。
         * 此参数为创建高级版产品，产品节点类型为网关或不接入网关的设备时的特有参数。
         *
         * 可选值：
         *
         * WIFI: WiFi
         * CELLULAR：蜂窝网
         * ETHERNET：以太网
         * OTHER：其他
         * 若不传入此参数，则默认为WiFi。
         */
        request.setNetType(createProductPo.getNetType());
        try {
            CreateProductResponse response = client.getAcsResponse(request);
            System.err.println(response.getSuccess());
            System.err.println(response.getErrorMessage());
            if (response.getSuccess()) {
                CreateProductResponse.Data respData = response.getData();
                System.err.println(JSONObject.toJSONString(respData));
                ProductRespPo createProductRespPo = new ProductRespPo();
                BeanUtils.copyProperties(respData, createProductRespPo);
                return Result.newSuccess(createProductRespPo);
            }
            return Result.newError(ResultCode.CHANNEL_ERROR.getCode(), response.getErrorMessage());
        } catch (ServerException e) {
            log.error("【阿里云】创建产品服务端异常!{}", e);
            return Result.newError(ResultCode.FAIL);
        } catch (ClientException e) {
            log.error("【阿里云】创建产品客户端异常!{}", e);
            return Result.newError(ResultCode.FAIL);
        }
    }

    @Override
    public Result<Page<ProductRespPo>> findProductList(ProductCondPo productCondPo) {
        QueryProductListRequest request = new QueryProductListRequest();
        request.setCurrentPage(productCondPo.getPageNum());
        request.setPageSize(productCondPo.getPageSize());
        request.setAliyunCommodityCode(productCondPo.getCommodityCode());
        try {
            log.debug("【阿里云】查询产品列表请求参数:{}", JSONObject.toJSONString(request));
            QueryProductListResponse response = client.getAcsResponse(request);
            log.debug("【阿里云】查询产品列表响应数据:{}", JSONObject.toJSONString(response));
            if (response.getSuccess()) {
                QueryProductListResponse.Data respData = response.getData();
                System.err.println(JSONObject.toJSONString(respData));
                Page<ProductRespPo> productRespPoPage = new Page<>();
                productRespPoPage.setPages(respData.getPageCount());
                productRespPoPage.setPageNum(productCondPo.getPageNum());
                productRespPoPage.setPageSize(productCondPo.getPageSize());
                productRespPoPage.setTotal(respData.getTotal());
                List<QueryProductListResponse.Data.ProductInfo> productInfoList = respData.getList();
                for (QueryProductListResponse.Data.ProductInfo productInfo : productInfoList) {
                    ProductRespPo productRespPo = new ProductRespPo();
                    BeanUtils.copyProperties(productInfo, productRespPo);
                    productRespPoPage.add(productRespPo);
                }
                return Result.newSuccess(productRespPoPage);
            }
            return Result.newError(ResultCode.CHANNEL_ERROR.getCode(), response.getErrorMessage());
        } catch (ServerException e) {
            log.error("【阿里云】创建产品服务端异常!{}", e);
            return Result.newError(ResultCode.FAIL);
        } catch (ClientException e) {
            log.error("【阿里云】创建产品客户端异常!{}", e);
            return Result.newError(ResultCode.FAIL);
        }
    }


}
